<?php

// Copyright (c) 2010, Meadhbh S. Hamrick
// All rights reserved.
// 
// Redistribution  and use  in source  and  binary forms,  with or  without
// modification, are  permitted provided that the  following conditions are
// met:
// 
// * Redistributions of source code must retain the above copyright notice,
//   this list of conditions and the following disclaimer.
// 
// * Redistributions  in binary  form  must reproduce  the above  copyright
//   notice, this  list of conditions  and the following disclaimer  in the
//   documentation and/or other materials provided with the distribution.
// 
// * Neither  the  name  of  the  Project  Meadhbh nor  the  names  of  its
//   contributors may be  used to endorse or promote  products derived from
//   this software without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY  THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
// IS" AND  ANY EXPRESS OR  IMPLIED WARRANTIES, INCLUDING, BUT  NOT LIMITED
// TO,  THE  IMPLIED  WARRANTIES  OF  MERCHANTABILITY  AND  FITNESS  FOR  A
// PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT  SHALL THE  COPYRIGHT
// HOLDER OR  CONTRIBUTORS BE LIABLE FOR ANY  DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
// TO, PROCUREMENT OF  SUBSTITUTE GOODS OR SERVICES; LOSS  OF USE, DATA, OR
// PROFITS; OR BUSINESS  INTERRUPTION) HOWEVER CAUSED AND ON  ANY THEORY OF
// LIABILITY,  WHETHER IN  CONTRACT, STRICT  LIABILITY, OR  TORT (INCLUDING
// NEGLIGENCE  OR OTHERWISE)  ARISING IN  ANY WAY  OUT OF  THE USE  OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

require_once('DSD.php');
require_once('Broker.php');
require_once('LocalConfig.php');

$headers = apache_request_headers();
$method =  $_SERVER['REQUEST_METHOD'];
$operation = Broker::OperationFromHTTPMethod( $method );
$request_type =
  Broker::SerializationFromHTTPTypeHeader( $headers[ 'Content-Type' ] );
$request_accept =
  Broker::SerializationFromHTTPAcceptHeader( $headers[ 'Accept' ] );
$endpoint = $_SERVER['REDIRECT_QUERY_STRING' ];

$broker = new Broker( );
$broker->initPrefs( LocalConfig::getPrefs() );
$broker->setOperation( $operation );
$broker->setRequestBody( extract_content( $method ) );
$broker->setRequestType( $request_type );
$broker->setResponseType( $request_accept );

do {
  
  if( 200 != ( $status = $broker->considerOperationAndContentTypes() ) ) {
    break;
  }

  $broker->setEndpoint( $endpoint );

  if( 200 != ( $status = $broker->query() ) ) {
    break;
  }

  if( 200 != ( $status = $broker->considerOperationAndContentTypes() ) ) {
    break;
  }

} while( 0 );

header( "HTTP/1.1 " . Broker::HTTPStatusLine( $status ) );

if( ( $method == "OPTIONS" ) || ( $method == "HEAD" ) ||
    ( $method == "GET" ) || ( $method == "POST" ) ) {

  header( Broker::HTTPTypeFromSerialization( $broker->getResponseType() ) );
  header( "Content-Length: " + $broker->getResponseBodyLength() );

  echo $broker->getResponseBody();
}

function extract_content ( $method ) {
  global $HTTP_RAW_POST_DATA;

  $rv = NULL;

  switch( $method ) {
  case 'PUT':
    $rv = "";
    $fd = fopen( "php://input", "r" );
    while( ! feof( $fd ) ) {
      $input = fread( $fd, 1024 );
      $rv .= $input;
    }
    fclose( $fd );
    break;

  case 'POST':
    $rv = $HTTP_RAW_POST_DATA;
    break;
  }

  return( $rv );
}

?>